﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using IrendilDLL.Database;
using System.Data;
using IrendilDLL;
using System.Data.SqlClient;
using System.IO;
using IrendilDLL.utilities;


namespace IrendilDLL.PageControls
{
    /// <summary>
    /// Classe di controllo della pagina Configuration
    /// </summary>
    public class ConfigurationControl
    {
        /// <summary>
        /// Costruttore di default
        /// </summary>
        public ConfigurationControl()
        {
            // Procedo solo se é correttamente inizializzata la variabile di sessione
            installationGUID = (String)HttpContext.Current.Session["installationGUID"];

            // Ottengo la stringa di connessione al db
            localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;

            //// Istanzio la classe di appoggio per il db di irendil
            //irendilDbManager = new IrendilDbManager(localSqlServerStr);
            //// Istanzio la classe di appoggio per il db
            //dbManager = new DataBaseManager(localSqlServerStr);
        }

        /// <summary>
        /// Guid installazione di riferimento
        /// </summary>
        String installationGUID = null;
        /// <summary>
        /// Stringa di connessione al db
        /// </summary>
        string localSqlServerStr = null;
        /// <summary>
        /// Riferimento al file di log
        /// </summary>
        TextWriter logFile;
        ///// <summary>
        ///// Istanta di appoggio alla classe gestione db
        ///// </summary>
        //DataBaseManager dbManager = null;
        ///// <summary>
        ///// Istanta di appoggio alla classe gestione db di irendil
        ///// </summary>
        //IrendilDbManager irendilDbManager = null;

        #region Properties

        //public TextWriter LogFile
        //{
        //    get { return logFile; }
        //    set
        //    {
        //        logFile = value;
        //        // imposto il log file anche per il gestore db diretto
        //        dbManager.LogFile = value;
        //    }
        //}

        #endregion

        /// <summary>
        /// Metodo che ritorna tutti gli host della installazione della sessione
        /// </summary>
        /// <returns></returns>
        public DataTable getAllHostsForInstallation()
        {

            IrendilDbManager irendilDbManager = new IrendilDbManager(localSqlServerStr);
            DataSet hostDs = irendilDbManager.getHostsList(installationGUID);

            // Se la query torna dati continuo
            if (hostDs != null && hostDs.Tables.Count > 0)
            {
                // Ottengo il DataTable
                DataTable hostDt = hostDs.Tables[0];

                return hostDt;
            }
            else
                return null;
        }

        /// <summary>
        /// Metodo che ritorna tutti gli ospedali della installazione della sessione
        /// </summary>
        /// <returns></returns>
        public DataTable getAllHospitalsForInstallation()
        {
            IrendilDbManager irendilDbManager = new IrendilDbManager(localSqlServerStr);
            DataSet hostDs = irendilDbManager.getHospitalsList(installationGUID);

            // Se la query torna dati continuo
            if (hostDs != null && hostDs.Tables.Count > 0)
            {
                // Ottengo il DataTable
                DataTable hostDt = hostDs.Tables[0];

                return hostDt;
            }
            else
                return null;
        }

        /// <summary>
        /// Metodo che ritorna tutti gli ospedali della installazione della sessione
        /// </summary>
        /// <returns></returns>
        public DataTable getAllHostTypes()
        {
            IrendilDbManager irendilDbManager = new IrendilDbManager(localSqlServerStr);
            DataSet hostDs = irendilDbManager.getHostTypesList();

            // Se la query torna dati continuo
            if (hostDs != null && hostDs.Tables.Count > 0)
            {
                // Ottengo il DataTable
                DataTable hostDt = hostDs.Tables[0];

                return hostDt;
            }
            else
                return null;
        }

        /// <summary>
        /// Metodo che inserisce un nuovo host/server
        /// </summary>
        /// <returns></returns>
        public void insertHost(String Guid, String Host, String Description, String GUIDHospital, String GUIDHostType, String Provider, String AET, String Port, String PrimaryIp, String SecondaryIp, String WinUsername, String WinPassword, String ServiceUsername, String ServicePassword, String CAP, String Address, String Note, String Lat, String Lon)
        {

            try
            {

                // Imposto i parametri per la QUERY
                SqlParameter[] parameters = new SqlParameter[20];
                parameters[0] = new SqlParameter("@GUIDInstallation", installationGUID);
                parameters[1] = new SqlParameter("@GUIDHospital", GUIDHospital);
                parameters[2] = new SqlParameter("@Host", Host);
                parameters[3] = new SqlParameter("@Description", Description);
                parameters[4] = new SqlParameter("@GUIDHostType", GUIDHostType);
                parameters[5] = new SqlParameter("@Provider", Provider);
                parameters[6] = new SqlParameter("@AET", AET);
                if (Port == "")
                    parameters[7] = new SqlParameter("@Port", DBNull.Value);
                else
                    parameters[7] = new SqlParameter("@Port", Port);
                parameters[8] = new SqlParameter("@PrimaryIp", PrimaryIp);
                parameters[9] = new SqlParameter("@SecondaryIp", SecondaryIp);
                parameters[10] = new SqlParameter("@WinUsername", WinUsername);
                parameters[11] = new SqlParameter("@WinPassword", WinPassword);
                parameters[12] = new SqlParameter("@ServiceUsername", ServiceUsername);
                parameters[13] = new SqlParameter("@ServicePassword", ServicePassword);
                parameters[14] = new SqlParameter("@Address", Address);
                if (CAP == "")
                    parameters[15] = new SqlParameter("@CAP", DBNull.Value);
                else
                    parameters[15] = new SqlParameter("@CAP", CAP);
                parameters[16] = new SqlParameter("@Note", Note);
                if (Lat == "")
                    parameters[17] = new SqlParameter("@Lat", DBNull.Value);
                else
                    parameters[17] = new SqlParameter("@Lat", Lat.Replace(",", "."));
                if (Lon == "")
                    parameters[18] = new SqlParameter("@Lon", DBNull.Value);
                else
                    parameters[18] = new SqlParameter("@Lon", Lon.Replace(",", "."));
                //parameters[19] = new SqlParameter("@GUID", "");

                // Istanzio l'oggetto per la connessione al db
                DataBaseManager dbManager = new DataBaseManager(localSqlServerStr);
                // Apro la transazione, eseguo la store e la chiudo
                dbManager.OpenTransaction();
                DataSet hostDs = dbManager.EseguiStored("sp_insertHosts", parameters);
                dbManager.CloseTransaction();

            }
            catch (Exception ex)
            {
                // Istanzio la classe di gestione dell'errore
                LogErrors logError = new LogErrors();
                // Scrivo l'errore su file
                logError.WriteLogToFile(ex.Source+": "+ex.Message);
                // Rimbalzo l'eccezione per la visualizzazione su gui
                throw ex;
            }

        }

        /// <summary>
        /// Metodo che esegue l'update di un host/server
        /// </summary>
        /// <returns></returns>
        public void updateHost(Guid Guid, String Host, String Description, String GUIDHospital, String GUIDHostType, String Provider, String AET, String Port, String PrimaryIp, String SecondaryIp, String WinUsername, String WinPassword, String ServiceUsername, String ServicePassword, String CAP, String Address, String Note, String Lat, String Lon)
        {
            try
            {

                // Imposto i parametri per la QUERY
                SqlParameter[] parameters = new SqlParameter[19];
                parameters[0] = new SqlParameter("@GUIDHospital", GUIDHospital);
                parameters[1] = new SqlParameter("@Host", Host);
                parameters[2] = new SqlParameter("@Description", Description);
                parameters[3] = new SqlParameter("@GUIDHostType", GUIDHostType);
                parameters[4] = new SqlParameter("@Provider", Provider);
                parameters[5] = new SqlParameter("@AET", AET);
                if (Port == "")
                    parameters[6] = new SqlParameter("@Port", DBNull.Value);
                else
                    parameters[6] = new SqlParameter("@Port", Port);
                parameters[7] = new SqlParameter("@PrimaryIp", PrimaryIp);
                parameters[8] = new SqlParameter("@SecondaryIp", SecondaryIp);
                parameters[9] = new SqlParameter("@WinUsername", WinUsername);
                parameters[10] = new SqlParameter("@WinPassword", WinPassword);
                parameters[11] = new SqlParameter("@ServiceUsername", ServiceUsername);
                parameters[12] = new SqlParameter("@ServicePassword", ServicePassword);
                parameters[13] = new SqlParameter("@Address", Address);
                if (CAP == "")
                    parameters[14] = new SqlParameter("@CAP", DBNull.Value);
                else
                    parameters[14] = new SqlParameter("@CAP", CAP);
                parameters[15] = new SqlParameter("@Note", Note);
                if (Lat == "")
                    parameters[16] = new SqlParameter("@Lat", DBNull.Value);
                else
                    parameters[16] = new SqlParameter("@Lat", Lat.Replace(",","."));
                if (Lon == "")
                    parameters[17] = new SqlParameter("@Lon", DBNull.Value);
                else
                    parameters[17] = new SqlParameter("@Lon", Lon.Replace(",", "."));
                parameters[18] = new SqlParameter("@GUID", Guid);

                // Istanzio l'oggetto per la connessione al db
                DataBaseManager dbManager = new DataBaseManager(localSqlServerStr);
                // Apro la transazione, eseguo la store e la chiudo
                dbManager.OpenTransaction();
                DataSet hostDs = dbManager.EseguiStored("sp_updateHosts", parameters);
                dbManager.CloseTransaction();

            }
            catch (Exception ex)
            {
                // Istanzio la classe di gestione dell'errore
                LogErrors logError = new LogErrors();
                // Scrivo l'errore su file
                logError.WriteLogToFile(ex.Source+": "+ex.Message);
                // Rimbalzo l'eccezione per la visualizzazione su gui
                throw ex;
            }

        }


        /// <summary>
        /// Metodo che esegue la delete di un host/server
        /// </summary>
        /// <returns></returns>
        public void deleteHost(Guid Guid)
        {
            try
            {

                // Imposto i parametri per la QUERY
                SqlParameter[] parameters = new SqlParameter[1];
                parameters[0] = new SqlParameter("@GUID", Guid);

                // Istanzio l'oggetto per la connessione al db
                DataBaseManager dbManager = new DataBaseManager(localSqlServerStr);
                // Apro la transazione, eseguo la store e la chiudo
                dbManager.OpenTransaction();
                DataSet hostDs = dbManager.EseguiStored("sp_deleteHosts", parameters);
                dbManager.CloseTransaction();

            }
            catch (Exception ex)
            {
                // Istanzio la classe di gestione dell'errore
                LogErrors logError = new LogErrors();
                // Scrivo l'errore su file
                logError.WriteLogToFile(ex.Source+": "+ex.Message);
                // Rimbalzo l'eccezione per la visualizzazione su gui
                throw ex;
            }

        }


    }



}